///*******************************************************************************
// * Copyright (c) 2007, 2008 IBM Corporation and others.
// * All rights reserved. This program and the accompanying materials
// * are made available under the terms of the Eclipse Public License v1.0
// * which accompanies this distribution, and is available at
// * http://www.eclipse.org/legal/epl-v10.html
// *
// * Contributors:
// * IBM Corporation - initial API and implementation
// *******************************************************************************/
//
//package org.eclipse.ui.internal.keys.model;
//
//import java.io.BufferedWriter;
//import java.io.FileWriter;
//import java.io.IOException;
//import java.io.Writer;
//import java.util.Map;
//import java.util.ResourceBundle;
//
//import org.eclipse.core.commands.CommandManager;
//import org.eclipse.core.commands.ParameterizedCommand;
//import org.eclipse.core.commands.common.NotDefinedException;
//import org.eclipse.core.commands.contexts.ContextManager;
//import org.eclipse.core.runtime.IStatus;
//import org.eclipse.core.runtime.ListenerList;
//import org.eclipse.core.runtime.SafeRunner;
//import org.eclipse.core.runtime.Status;
//import org.eclipse.jface.bindings.Binding;
//import org.eclipse.jface.bindings.BindingManager;
//import org.eclipse.jface.bindings.Scheme;
//import org.eclipse.jface.bindings.keys.KeyBinding;
//import org.eclipse.jface.bindings.keys.KeySequence;
//import org.eclipse.jface.util.IPropertyChangeListener;
//import org.eclipse.jface.util.PropertyChangeEvent;
//import org.eclipse.jface.util.SafeRunnable;
//import org.eclipse.swt.SWT;
//import org.eclipse.swt.widgets.FileDialog;
//import org.eclipse.swt.widgets.Shell;
//import org.eclipse.ui.contexts.IContextService;
//import org.eclipse.ui.internal.WorkbenchPlugin;
//import org.eclipse.ui.internal.keys.KeysPreferencePage;
//import org.eclipse.ui.internal.keys.NewKeysPreferenceMessages;
//import org.eclipse.ui.internal.misc.StatusUtil;
//import org.eclipse.ui.internal.util.Util;
//import org.eclipse.ui.keys.IBindingService;
//import org.eclipse.ui.services.IServiceLocator;
//import org.eclipse.ui.statushandlers.StatusManager;
//
///**
// * @since 3.4
// *
// */
//public class KeyController {
// private static final String DELIMITER = ","; //$NON-NLS-1$
// private static final String ESCAPED_QUOTE = "\""; //$NON-NLS-1$
// private static final String REPLACEMENT = "\"\""; //$NON-NLS-1$
// /**
// * The resource bundle from which translations can be retrieved.
// */
// private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
// .getBundle(KeysPreferencePage.class.getName());
// private ListenerList eventManager = null;
// private BindingManager fBindingManager;
// private ContextModel contextModel;
// private SchemeModel fSchemeModel;
// private BindingModel bindingModel;
// private boolean notifying = true;
// private ConflictModel conflictModel;
// private IServiceLocator serviceLocator;
//
// private ListenerList getEventManager() {
// if (eventManager == null) {
// eventManager = new ListenerList(ListenerList.IDENTITY);
// }
// return eventManager;
// }
//
// public void setNotifying(boolean b) {
// notifying = b;
// }
//
// public boolean isNotifying() {
// return notifying;
// }
//
// public void firePropertyChange(Object source, String propId, Object oldVal,
// Object newVal) {
// if (!isNotifying()) {
// return;
// }
// if (Util.equals(oldVal, newVal)) {
// return;
// }
//
// Object[] listeners = getEventManager().getListeners();
// PropertyChangeEvent event = new PropertyChangeEvent(source, propId,
// oldVal, newVal);
// for (int i = 0; i < listeners.length; i++) {
// ((IPropertyChangeListener) listeners[i]).propertyChange(event);
// }
// }
//
// public void addPropertyChangeListener(IPropertyChangeListener listener) {
// getEventManager().add(listener);
// }
//
// public void removePropertyChangeListener(IPropertyChangeListener listener) {
// getEventManager().remove(listener);
// }
//
// public void init(IServiceLocator locator) {
// getEventManager().clear();
// this.serviceLocator = locator;
// fBindingManager = loadModelBackend(serviceLocator);
// contextModel = new ContextModel(this);
// contextModel.init(serviceLocator);
// fSchemeModel = new SchemeModel(this);
// fSchemeModel.init(fBindingManager);
// bindingModel = new BindingModel(this);
// bindingModel.init(serviceLocator, fBindingManager, contextModel);
// conflictModel = new ConflictModel(this);
// conflictModel.init(fBindingManager, bindingModel);
// addSetContextListener();
// addSetBindingListener();
// addSetConflictListener();
// addSetKeySequenceListener();
// addSetSchemeListener();
// addSetModelObjectListener();
// }
//
// private static BindingManager loadModelBackend(IServiceLocator locator) {
// IBindingService bindingService = (IBindingService) locator
// .getService(IBindingService.class);
// BindingManager bindingManager = new BindingManager(
// new ContextManager(), new CommandManager());
// final Scheme[] definedSchemes = bindingService.getDefinedSchemes();
// try {
// for (int i = 0; i < definedSchemes.length; i++) {
// final Scheme scheme = definedSchemes[i];
// final Scheme copy = bindingManager.getScheme(scheme.getId());
// copy.define(scheme.getName(), scheme.getDescription(), scheme
// .getParentId());
// if (definedSchemes[i] == bindingService.getActiveScheme()) {
// bindingManager.setActiveScheme(copy);
// }
// }
//
// } catch (final NotDefinedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// bindingManager.setLocale(bindingService.getLocale());
// bindingManager.setPlatform(bindingService.getPlatform());
// bindingManager.setBindings(bindingService.getBindings());
// return bindingManager;
// }
//
// public ContextModel getContextModel() {
// return contextModel;
// }
//
// public SchemeModel getSchemeModel() {
// return fSchemeModel;
// }
//
// public BindingModel getBindingModel() {
// return bindingModel;
// }
//
// public ConflictModel getConflictModel() {
// return conflictModel;
// }
//
// private void addSetContextListener() {
// addPropertyChangeListener(new IPropertyChangeListener() {
// public void propertyChange(PropertyChangeEvent event) {
// if (event.getSource() == contextModel
// && CommonModel.PROP_SELECTED_ELEMENT.equals(event
// .getProperty())) {
// updateBindingContext((ContextElement) event.getNewValue());
// }
// }
// });
// }
//
// private void addSetBindingListener() {
// addPropertyChangeListener(new IPropertyChangeListener() {
// public void propertyChange(PropertyChangeEvent event) {
// if (event.getSource() == bindingModel
// && CommonModel.PROP_SELECTED_ELEMENT.equals(event
// .getProperty())) {
// BindingElement binding = (BindingElement) event
// .getNewValue();
// if (binding == null) {
// conflictModel.setSelectedElement(null);
// contextModel.setSelectedElement(null);
// return;
// }
// conflictModel.setSelectedElement(binding);
// contextModel.setSelectedElement(binding.getContext());
// }
// }
// });
// }
//
// private void addSetConflictListener() {
// addPropertyChangeListener(new IPropertyChangeListener() {
// public void propertyChange(PropertyChangeEvent event) {
// if (event.getSource() == conflictModel
// && CommonModel.PROP_SELECTED_ELEMENT.equals(event
// .getProperty())) {
// if (event.getNewValue() != null) {
// bindingModel.setSelectedElement((ModelElement) event
// .getNewValue());
// }
// }
// }
// });
// }
//
// private void addSetKeySequenceListener() {
// addPropertyChangeListener(new IPropertyChangeListener() {
// public void propertyChange(PropertyChangeEvent event) {
// if (BindingElement.PROP_TRIGGER.equals(event.getProperty())) {
// updateTrigger((BindingElement) event.getSource(),
// (KeySequence) event.getOldValue(),
// (KeySequence) event.getNewValue());
// }
// }
// });
// }
//
// private void addSetModelObjectListener() {
// addPropertyChangeListener(new IPropertyChangeListener() {
// public void propertyChange(PropertyChangeEvent event) {
// if (event.getSource() instanceof BindingElement
// && ModelElement.PROP_MODEL_OBJECT.equals(event
// .getProperty())) {
// if (event.getNewValue() != null) {
// BindingElement element = (BindingElement) event
// .getSource();
// Object oldValue = event.getOldValue();
// Object newValue = event.getNewValue();
// if (oldValue instanceof Binding
// && newValue instanceof Binding) {
// conflictModel.updateConflictsFor(element,
// ((Binding) oldValue).getTriggerSequence(),
// ((Binding) newValue).getTriggerSequence(),
// false);
// } else {
// conflictModel.updateConflictsFor(element, false);
// }
//
// ContextElement context = element.getContext();
// contextModel.setSelectedElement(context);
// }
// }
// }
// });
// }
//
// private void addSetSchemeListener() {
// addPropertyChangeListener(new IPropertyChangeListener() {
// public void propertyChange(PropertyChangeEvent event) {
// if (event.getSource() == fSchemeModel
// && CommonModel.PROP_SELECTED_ELEMENT.equals(event
// .getProperty())) {
// changeScheme((SchemeElement) event.getOldValue(),
// (SchemeElement) event.getNewValue());
// }
// }
// });
// }
//
// /**
// * @param oldScheme
// * @param newScheme
// */
// protected void changeScheme(SchemeElement oldScheme, SchemeElement newScheme) {
// if (newScheme == null
// || newScheme.getModelObject() == fBindingManager
// .getActiveScheme()) {
// return;
// }
// try {
// fBindingManager
// .setActiveScheme((Scheme) newScheme.getModelObject());
// bindingModel.refresh(contextModel);
// bindingModel.setSelectedElement(null);
// } catch (NotDefinedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// }
//
// private void updateBindingContext(ContextElement context) {
// if (context == null) {
// return;
// }
// BindingElement activeBinding = (BindingElement) bindingModel
// .getSelectedElement();
// if (activeBinding == null) {
// return;
// }
// String activeSchemeId = fSchemeModel.getSelectedElement().getId();
// Object obj = activeBinding.getModelObject();
// if (obj instanceof KeyBinding) {
// KeyBinding keyBinding = (KeyBinding) obj;
// if (!keyBinding.getContextId().equals(context.getId())) {
// final KeyBinding binding = new KeyBinding(keyBinding
// .getKeySequence(),
// keyBinding.getParameterizedCommand(), activeSchemeId,
// context.getId(), null, null, null, Binding.USER);
// if (keyBinding.getType() == Binding.USER) {
// fBindingManager.removeBinding(keyBinding);
// } else {
// fBindingManager.addBinding(new KeyBinding(keyBinding
// .getKeySequence(), null, keyBinding.getSchemeId(),
// keyBinding.getContextId(), null, null, null,
// Binding.USER));
// }
// bindingModel.getBindingToElement().remove(
// activeBinding.getModelObject());
//
// fBindingManager.addBinding(binding);
// activeBinding.fill(binding, contextModel);
// bindingModel.getBindingToElement().put(binding, activeBinding);
// }
// }
// }
//
// /**
// * @param activeBinding
// * @param oldSequence
// * @param keySequence
// */
// public void updateTrigger(BindingElement activeBinding,
// KeySequence oldSequence, KeySequence keySequence) {
// if (activeBinding == null) {
// return;
// }
// Object obj = activeBinding.getModelObject();
// if (obj instanceof KeyBinding) {
// KeyBinding keyBinding = (KeyBinding) obj;
// if (!keyBinding.getKeySequence().equals(keySequence)) {
// if (keySequence != null && !keySequence.isEmpty()) {
// String activeSchemeId = fSchemeModel.getSelectedElement()
// .getId();
// String activeContextId = contextModel.getSelectedElement()
// .getId();
// final KeyBinding binding = new KeyBinding(keySequence,
// keyBinding.getParameterizedCommand(),
// activeSchemeId, activeContextId, null, null, null,
// Binding.USER);
// Map bindingToElement = bindingModel.getBindingToElement();
// bindingToElement.remove(keyBinding);
// if (keyBinding.getType() == Binding.USER) {
// fBindingManager.removeBinding(keyBinding);
// } else {
// fBindingManager.addBinding(new KeyBinding(keyBinding
// .getKeySequence(), null, keyBinding
// .getSchemeId(), keyBinding.getContextId(),
// null, null, null, Binding.USER));
// }
//
// fBindingManager.addBinding(binding);
// activeBinding.fill(binding, contextModel);
// bindingModel.getBindingToElement().put(binding,
// activeBinding);
//
// // Remove binding for any system conflicts
// Object[] keys = bindingToElement.keySet().toArray();
// for (int i = 0; i < keys.length; i++) {
// Binding bindingKey = (Binding) keys[i];
// if (oldSequence.equals(bindingKey.getTriggerSequence())
// && bindingKey.getType() == Binding.SYSTEM) {
// BindingElement be = (BindingElement) bindingToElement
// .get(bindingKey);
// bindingModel.remove(be);
// }
// }
//
// bindingModel.setSelectedElement(activeBinding);
// } else {
// bindingModel.getBindingToElement().remove(keyBinding);
// if (keyBinding.getType() == Binding.USER) {
// fBindingManager.removeBinding(keyBinding);
// } else {
// fBindingManager.addBinding(new KeyBinding(keyBinding
// .getKeySequence(), null, keyBinding
// .getSchemeId(), keyBinding.getContextId(),
// null, null, null, Binding.USER));
// }
// activeBinding.fill(keyBinding.getParameterizedCommand());
// }
// }
// } else if (obj instanceof ParameterizedCommand) {
// ParameterizedCommand cmd = (ParameterizedCommand) obj;
// if (keySequence != null && !keySequence.isEmpty()) {
// String activeSchemeId = fSchemeModel.getSelectedElement()
// .getId();
// String activeContextId = IContextService.CONTEXT_ID_WINDOW;
// final KeyBinding binding = new KeyBinding(keySequence, cmd,
// activeSchemeId, activeContextId, null, null, null,
// Binding.USER);
// fBindingManager.addBinding(binding);
// activeBinding.fill(binding, contextModel);
// bindingModel.getBindingToElement().put(binding, activeBinding);
// }
// }
// }
//
// /**
// * Replaces all the current bindings with the bindings in the local copy of
// * the binding manager.
// *
// * @param bindingService
// * The binding service that saves the changes made to the local
// * copy of the binding manager
// */
// public void saveBindings(IBindingService bindingService) {
// try {
// bindingService.savePreferences(fBindingManager.getActiveScheme(),
// fBindingManager.getBindings());
// } catch (IOException e) {
// logPreferenceStoreException(e);
// }
// }
//
// /**
// * Logs the given exception, and opens an error dialog saying that something
// * went wrong. The exception is assumed to have something to do with the
// * preference store.
// *
// * @param exception
// * The exception to be logged; must not be <code>null</code>.
// */
// private final void logPreferenceStoreException(final Throwable exception) {
// final String message = NewKeysPreferenceMessages.PreferenceStoreError_Message;
// String exceptionMessage = exception.getMessage();
// if (exceptionMessage == null) {
// exceptionMessage = message;
// }
// final IStatus status = new Status(IStatus.ERROR,
// WorkbenchPlugin.PI_WORKBENCH, 0, exceptionMessage, exception);
// WorkbenchPlugin.log(message, status);
// StatusUtil.handleStatus(message, exception, StatusManager.SHOW);
// }
//
// /**
// * Filters contexts for the When Combo.
// *
// * @param actionSets
// * <code>true</code> to filter action set contexts
// * @param internal
// * <code>false</code> to filter internal contexts
// *
// */
// public void filterContexts(boolean actionSets, boolean internal) {
// contextModel.filterContexts(actionSets, internal);
// }
//
// /**
// * Sets the bindings to default.
// *
// * @param bindingService
// */
// public void setDefaultBindings(IBindingService bindingService) {
// // Fix the scheme in the local changes.
// final String defaultSchemeId = bindingService.getDefaultSchemeId();
// final Scheme defaultScheme = fBindingManager.getScheme(defaultSchemeId);
// try {
// fBindingManager.setActiveScheme(defaultScheme);
// } catch (final NotDefinedException e) {
// // At least we tried....
// }
//
// // Restore any User defined bindings
// Binding[] bindings = fBindingManager.getBindings();
// for (int i = 0; i < bindings.length; i++) {
// if (bindings[i].getType() == Binding.USER) {
// fBindingManager.removeBinding(bindings[i]);
// }
// }
//
// bindingModel.refresh(contextModel);
// saveBindings(bindingService);
// }
//
// public void exportCSV(Shell shell) {
// final FileDialog fileDialog = new FileDialog(shell, SWT.SAVE);
// fileDialog.setFilterExtensions(new String[] { "*.csv" }); //$NON-NLS-1$
// fileDialog.setFilterNames(new String[] { Util.translateString(
// RESOURCE_BUNDLE, "csvFilterName") }); //$NON-NLS-1$
// final String filePath = fileDialog.open();
// if (filePath == null) {
// return;
// }
//
// final SafeRunnable runnable = new SafeRunnable() {
// public final void run() throws IOException {
// Writer fileWriter = null;
// try {
// fileWriter = new BufferedWriter(new FileWriter(filePath));
// final Object[] bindingElements = bindingModel.getBindings()
// .toArray();
// for (int i = 0; i < bindingElements.length; i++) {
// final BindingElement be = (BindingElement) bindingElements[i];
// if (be.getTrigger() == null
// || be.getTrigger().isEmpty()) {
// continue;
// }
// StringBuffer buffer = new StringBuffer();
// buffer.append(ESCAPED_QUOTE
// + Util.replaceAll(be.getCategory(),
// ESCAPED_QUOTE, REPLACEMENT)
// + ESCAPED_QUOTE + DELIMITER);
// buffer.append(ESCAPED_QUOTE + be.getName()
// + ESCAPED_QUOTE + DELIMITER);
// buffer.append(ESCAPED_QUOTE + be.getTrigger().format()
// + ESCAPED_QUOTE + DELIMITER);
// buffer.append(ESCAPED_QUOTE + be.getContext().getName()
// + ESCAPED_QUOTE);
// buffer.append(System.getProperty("line.separator")); //$NON-NLS-1$
// fileWriter.write(buffer.toString());
// }
//
// } finally {
// if (fileWriter != null) {
// try {
// fileWriter.close();
// } catch (final IOException e) {
// // At least I tried.
// }
// }
//
// }
// }
// };
// SafeRunner.run(runnable);
// }
//}